/**
 * 负载均衡策略接口
 * 定义了数据源负载均衡的核心方法
 */
public interface LoadBalanceStrategy {
    /**
     * 从可用数据源列表中选择一个数据源
     * @param dataSources 可用的数据源包装器列表
     * @return 选中的数据源
     */
    DataSource select(List<DataSourceWrapper> dataSources);
}

/**
 * 轮询负载均衡策略实现
 * 按照顺序循环选择数据源
 */
@Component
public class RoundRobinStrategy implements LoadBalanceStrategy {
    // 计数器,用于记录当前轮询位置
    private final AtomicInteger counter = new AtomicInteger(0);
    
    @Override
    public DataSource select(List<DataSourceWrapper> dataSources) {
        // 通过原子计数器获取下一个索引位置
        int index = Math.abs(counter.getAndIncrement() % dataSources.size());
        // 返回选中的数据源
        return dataSources.get(index).getDataSource();
    }
}

/**
 * 加权随机负载均衡策略实现
 * 根据权重随机选择数据源
 */
@Component
public class WeightedRandomStrategy implements LoadBalanceStrategy {
    // 随机数生成器
    private final Random random = new Random();
    
    @Override
    public DataSource select(List<DataSourceWrapper> dataSources) {
        // 计算总权重
        int totalWeight = dataSources.stream()
            .mapToInt(DataSourceWrapper::getWeight)
            .sum();
            
        // 生成随机权重值
        int randomWeight = random.nextInt(totalWeight);
        int currentWeight = 0;
        
        // 遍历数据源,根据权重选择
        for (DataSourceWrapper wrapper : dataSources) {
            currentWeight += wrapper.getWeight();
            if (randomWeight < currentWeight) {
                return wrapper.getDataSource();
            }
        }
        
        // 默认返回第一个数据源
        return dataSources.get(0).getDataSource();
    }
} 